package com.hdp.kotlin_samples.middle

import kotlin.properties.Delegates

/**
 * author:hdp
 * on:2019/6/13:10:19
 * desc:
 *
 * 懒初始化  by lazy 和 延迟初始化 lateinit
 *
 * 1、对象的懒初始化 by lazy
 *      1）：用来懒初始化 val修饰的变量
 *      2）：变量在第一次使用的时候才去实例化，不使用的时候不会初始化
 *
 * 2、对象的延迟初始化 lateinit
 *      1）：用来初始化 var 修饰的 "非空变量"，解决不可空的var变量定义时候需要初始化问题
 *      2）：通常是初始化依赖于某些无法立即获得的上下文
 *      3）：开发者自己保证使用前已经初始化，否则会报:UninitializedPropertyAccessException
 *
 * 4、基础类型的延迟初始化
 *      1）： Delegates.notNull<Int>()
 *      2）： 使用之前也要保证已经初始化了，否则会报出：IllegalStateException
 *
 */

fun main() {
    println("========by lazy:$user1")
    age = 123
    println("========基本类型的延迟初始化：$age")
    testLateInit()
}


data class User(var name: String, var age: Int)

/*
* 懒初始化by lazy
* */
val user1: User by lazy {
    User("jack", 15)
}

/**
 * 延迟初始化lateinit
 * 对于var的变量，如果类型是非空的，是必须初始化的，不然编译不通过，这时候需要用到lateinit延迟初始化，使用的时候再去实例化。
 */
lateinit var user2: User

fun testLateInit() {
    user2 = User("Lily", 14)
    println("=======懒初始化：${user2}")
}

var age by Delegates.notNull<Int>()